package chapter02.s03operator;

public class BitOperator {
    public static void main(String[] args) {
        // 位运算符，应用于整数类型(int)，长整型(long)，短整型(short)，字符型(char)，和字节型(byte)等类型。
        // 位运算符作用在所有的位上，并且按位运算。
        /*
            A = 0011 1100
            B = 0000 1101
            -----------------
            A & B = 0000 1100
            A | B = 0011 1101
            A ^ B = 0011 0001
            ~A    = 1100 0011
            操作符       描述                                                    例子
            &           按位与，如果相对应位都是1，则结果为1，否则为0                （A&B），得到12，即0000 1100
            |           按位或，如果相对应位都是 0，则结果为 0，否则为 1             （A | B）得到61，即 0011 1101
            ^           按位异或，如果相对应位值相同，则结果为0，否则为1               （A ^ B）得到49，即 0011 0001
            ~           按位取反，翻转操作数的每一位，即0变成1，1变成0。              （~A）得到-61，即1100 0011
            <<          按位左移运算符。                                         A << 2得到240，即 1111 0000
            >>          有符号按位右移运算符。移动得到的空位以符号位填充。             A >> 2得到15即 1111
            >>>         无符号按位右移操作符。移动得到的空位以零填充。                 A>>>2得到15即0000 1111
         */

        int a = 60; /* 60 = 0011 1100 */
        int b = 13; /* 13 = 0000 1101 */
        int c = 0;
        c = a & b;       /* 12 = 0000 1100 */
        System.out.println("a & b = " + c);

        c = a | b;       /* 61 = 0011 1101 */
        System.out.println("a | b = " + c);

        c = a ^ b;       /* 49 = 0011 0001 */
        System.out.println("a ^ b = " + c);

        c = ~a;          /*-61 = 1100 0011 */
        System.out.println("~a = " + c);

        c = a << 2;     /* 240 = 1111 0000 */
        System.out.println("a << 2 = " + c);

        c = a >> 2;     /* 15 = 1111 */
        System.out.println("a >> 2  = " + c);

        c = a >>> 2;     /* 15 = 0000 1111 */
        System.out.println("a >>> 2 = " + c);

        // 右移，比较有符号、无符号
        Integer e = -10;
        System.out.println("e=" + e);
        System.out.println("e binary=" + Integer.toBinaryString(e));
        System.out.println("e >> 2=" + Integer.toBinaryString(e >> 2));
        System.out.println("e >>> 2=" + Integer.toBinaryString(e >>> 2));
    }
}
